let myFetch = () => {
	return new Promise((resolve, reject) => {
		setTimeout(() => resolve('这里成功返回数据'), 1000);
	});
};

function m1() {
	return myFetch();
}

function m2() {
	return m1();
}

function m3() {
	return m2();
}
function main() {
	console.log('main调用了');
	const data: any = m3();
	console.log('data', data);
	return data.data;
}

// run函数提供执行环境
function run(func) {
	// 定义cache来进行缓存
	const cache: any = {
		status: 'pending',
		data: null,
		err: null,
	};
	// 将原来异步函数进行缓存
	const beforeAsyncFn = myFetch;
	// 重写myFetch函数
	myFetch = (...args) => {
		// 如果发现状态已经不是pending 就返回
		if (cache.status !== 'pending') return cache;
		// 通过抛出错误来执行异步数据请求
		throw beforeAsyncFn(...args)
			.then((res) => {
				// 成功更改缓存状态
				cache.status = 'fulfilled';
				cache.data = res;
			})
			.catch((err) => {
				// 失败改变缓存状态
				cache.status = 'rejected';
				cache.err = err;
			});
	};

	let result = null;
	let done = false;

	try {
		// 使用try 调用原函数 捕获错误
		result = func();
		done = true;
	} catch (err) {
		// 判断返回值是否是promise
		if (err instanceof Promise) {
			// 当通过异常抛出的 promise 发生回调 重新调用 原函数
			err.finally(() => {
				result = func();
				done = true;
				// 还原原始请求方法 不造成污染
				myFetch = beforeAsyncFn;
			});
		}
	}

	while (!done) {
		// 使用同步循环等待异步操作完成
		deasync.loopWhile(() => !done);
	}

	return result;
}

// 引入 deasync 库来同步等待
const deasync = require('deasync');

// 运行
let r = run(main);
console.log(r); // 应该输出"这里成功返回数据"

import * as content from './test';
import load from 'cheerio';
let ll: any = load;
let $: any = ll(content.html);
console.log($('title').text());
